
这段代码定义了一个名为 `CPDF_CIDFont` 的类，它是 `CPDF_Font` 类的子类，专门用于处理 CID（字符标识符，Character Identifier）字体。CID 字体通常用于 CJK（中文、日文、韩文）等复杂脚本的字体表示，因为这些语言的字符集非常庞大，使用 CID 可以更有效地管理和编码字符。

### 类定义

```cpp
class CPDF_CIDFont final : public CPDF_Font {
  ```

    `CPDF_CIDFont` 继承自 `CPDF_Font`，并且使用 `final` 关键字表示该类不能再被继承。这意味着 `CPDF_CIDFont` 是一个最终类，确保其行为不会被进一步修改或扩展。

    ### 枚举和结构体

    1. * *CIDSet * *
    ```cpp
    enum CIDSet : uint8_t {
    CIDSET_UNKNOWN,
    CIDSET_GB1,
    CIDSET_CNS1,
    CIDSET_JAPAN1,
    CIDSET_KOREA1,
    CIDSET_UNICODE,
    CIDSET_NUM_SETS
  };
  ```
    - **说明 * *：定义了不同的字符集类型，如 GB1（简体中文）、CNS1（繁体中文）、JAPAN1（日文）、KOREA1（韩文）和 UNICODE（通用字符集）。`CIDSET_NUM_SETS` 用于表示枚举值的数量。

    2. * *CIDTransform * *
    ```cpp
    struct CIDTransform {
    uint16_t cid;
    uint8_t a, b, c, d, e, f;
  };
  ```
    - **说明 * *：用于存储 CID 转换信息，包括 CID 和一些转换参数（a, b, c, d, e, f），这些参数可能用于特定的字符映射或变换逻辑。

    ### 静态成员函数

    - **CIDTransformToFloat * *
    ```cpp
    static float CIDTransformToFloat(uint8_t ch);
  ```
    - **功能 * *：将一个 `uint8_t` 类型的字符转换为 `float` 类型的浮点数。这个函数可能是为了处理某些特定的字符编码或转换需求。

    ### 公共成员函数

    1. * *构造函数和析构函数 * *
    -**构造函数 * *`CPDF_CIDFont(CPDF_Document * pDocument, RetainPtr<CPDF_Dictionary> pFontDict)`：
    - **参数 * *：
    - `pDocument`：指向 `CPDF_Document` 对象的指针，表示所属的 PDF 文档。
    - `pFontDict`：一个 `RetainPtr<CPDF_Dictionary > ` 类型的智能指针，指向字体字典。
    - **功能 * *：初始化 `CPDF_CIDFont` 对象，并根据提供的文档和字体字典进行设置。

    - **析构函数 * *`~CPDF_CIDFont() override`：
    - **功能 * *：确保在对象销毁时正确清理分配的资源。

    2. * *虚函数重载 * *
    -**IsCIDFont * *
    ```cpp
    bool IsCIDFont() const override;
  ```
    - **功能 * *：返回 `true`，表示这是一个 CID 字体。

    - **AsCIDFont * *
    ```cpp
    const CPDF_CIDFont * AsCIDFont() const override;
  CPDF_CIDFont* AsCIDFont() override;
  ```
    - **功能 * *：返回当前对象的 `CPDF_CIDFont` 指针，方便类型转换。

    - **GlyphFromCharCode * *
    ```cpp
    int GlyphFromCharCode(uint32_t charcode, bool* pVertGlyph) override;
  ```
    - **功能 * *：根据给定的字符码 `charcode` 获取对应的字形索引。如果 `pVertGlyph` 不为空，则设置为 `true` 表示垂直排版字形。

    - **GetCharWidthF * *
    ```cpp
    int GetCharWidthF(uint32_t charcode) override;
  ```
    - **功能 * *：获取指定字符码 `charcode` 的宽度。

    - **GetCharBBox * *
    ```cpp
    FX_RECT GetCharBBox(uint32_t charcode) override;
  ```
    - **功能 * *：获取指定字符码 `charcode` 的边界框（bounding box）。

    - **GetNextChar * *
    ```cpp
    uint32_t GetNextChar(ByteStringView pString, size_t * pOffset) const override;
  ```
    - **功能 * *：从字符串 `pString` 中获取下一个字符，并更新 `pOffset` 指向的偏移量。

    - **CountChar * *
    ```cpp
    size_t CountChar(ByteStringView pString) const override;
  ```
    - **功能 * *：计算字符串 `pString` 中的字符数量。

    - **AppendChar * *
    ```cpp
    void AppendChar(ByteString * str, uint32_t charcode) const override;
  ```
    - **功能 * *：将指定字符码 `charcode` 添加到字符串 `str` 中。

    - **IsVertWriting * *
    ```cpp
    bool IsVertWriting() const override;
  ```
    - **功能 * *：检查是否支持垂直排版。

    - **IsUnicodeCompatible * *
    ```cpp
    bool IsUnicodeCompatible() const override;
  ```
    - **功能 * *：检查字体是否与 Unicode 兼容。

    - **Load * *
    ```cpp
    bool Load() override;
  ```
    - **功能 * *：加载字体资源，返回 `true` 表示加载成功。

    - **UnicodeFromCharCode * *
    ```cpp
    WideString UnicodeFromCharCode(uint32_t charcode) const override;
  ```
    - **功能 * *：根据给定的字符码 `charcode` 获取对应的 Unicode 字符串。

    - **CharCodeFromUnicode * *
    ```cpp
    uint32_t CharCodeFromUnicode(wchar_t Unicode) const override;
  ```
    - **功能 * *：根据给定的 Unicode 字符获取对应的字符码 `charcode`。

    3. * *其他公共成员函数 * *
    -**CIDFromCharCode * *
    ```cpp
    uint16_t CIDFromCharCode(uint32_t charcode) const;
  ```
    - **功能 * *：根据给定的字符码 `charcode` 获取对应的 CID。

    - **GetCIDTransform * *
    ```cpp
    const CIDTransform * GetCIDTransform(uint16_t cid) const;
  ```
    - **功能 * *：根据给定的 CID 获取对应的 CID 转换信息。

    - **GetVertWidth * *
    ```cpp
    int16_t GetVertWidth(uint16_t cid) const;
  ```
    - **功能 * *：获取指定 CID 的垂直排版宽度。

    - **GetVertOrigin * *
    ```cpp
    CFX_Point16 GetVertOrigin(uint16_t cid) const;
  ```
    - **功能 * *：获取指定 CID 的垂直排版原点。

    - **GetCharSize * *
    ```cpp
    int GetCharSize(uint32_t charcode) const;
  ```
    - **功能 * *：获取指定字符码 `charcode` 的大小。

    ### 私有成员函数

    - **LoadGB2312 * *
    ```cpp
    void LoadGB2312();
  ```
    - **功能 * *：加载 GB2312 字符集的相关数据。

    - **GetGlyphIndex * *
    ```cpp
    int GetGlyphIndex(uint32_t unicodeb, bool* pVertGlyph);
  ```
    - **功能 * *：根据给定的 Unicode 字符获取字形索引。

    - **GetVerticalGlyph * *
    ```cpp
    int GetVerticalGlyph(int index, bool* pVertGlyph);
  ```
    - **功能 * *：根据给定的字形索引获取垂直排版字形。

    - **LoadSubstFont * *
    ```cpp
    void LoadSubstFont();
  ```
    - **功能 * *：加载替代字体，可能用于处理缺失字符或其他特殊情况。

    - **GetUnicodeFromCharCode * *
    ```cpp
    wchar_t GetUnicodeFromCharCode(uint32_t charcode) const;
  ```
    - **功能 * *：根据给定的字符码 `charcode` 获取对应的 Unicode 字符。

    ### 私有成员变量

    - **m_pCMap * *
    ```cpp
    RetainPtr<const CPDF_CMap> m_pCMap;
  ```
    - **说明 * *：指向 `CPDF_CMap` 对象的智能指针，用于字符映射表。

    - **m_pCID2UnicodeMap * *
    ```cpp
    UnownedPtr<const CPDF_CID2UnicodeMap> m_pCID2UnicodeMap;
  ```
    - **说明 * *：指向 `CPDF_CID2UnicodeMap` 对象的非拥有指针，用于 CID 到 Unicode 的映射。

    - **m_pStreamAcc * *
    ```cpp
    RetainPtr<CPDF_StreamAcc> m_pStreamAcc;
  ```
    - **说明 * *：指向 `CPDF_StreamAcc` 对象的智能指针，用于访问字体流数据。

    - **m_pTTGSUBTable * *
    ```cpp
    std::unique_ptr<CFX_CTTGSUBTable> m_pTTGSUBTable;
  ```
    - **说明 * *：指向 `CFX_CTTGSUBTable` 对象的唯一指针，用于处理 TrueType 字体的 GSUB 表（字形替换表）。

    - **m_FontType * *
    ```cpp
    CIDFontType m_FontType = CIDFontType::kTrueType;
  ```
    - **说明 * *：表示字体类型，可以是 `CIDFontType0`（Type 1 字体）或 `CIDFontType2`（TrueType 字体）。

    - **m_bCIDIsGID * *
    ```cpp
    bool m_bCIDIsGID = false;
  ```
    - **说明 * *：指示 CID 是否直接作为字形索引（GID）使用。

    - **m_bAnsiWidthsFixed * *
    ```cpp
    bool m_bAnsiWidthsFixed = false;
  ```
    - **说明 * *：指示 ANSI 宽度是否固定。

    - **m_bAdobeCourierStd * *
    ```cpp
    bool m_bAdobeCourierStd = false;
  ```
    - **说明 * *：指示是否为 Adobe Courier 标准字体。

    - **m_Charset * *
    ```cpp
    CIDSet m_Charset = CIDSET_UNKNOWN;
  ```
    - **说明 * *：表示字符集类型，默认为 `CIDSET_UNKNOWN`。

    - **m_DefaultWidth * *
    ```cpp
    int16_t m_DefaultWidth = 1000;
  ```
    - **说明 * *：默认字符宽度，默认值为 1000。

    - **m_DefaultVY * *
    ```cpp
    int16_t m_DefaultVY = 880;
  ```
    - **说明 * *：默认垂直排版 Y 坐标，默认值为 880。

    - **m_DefaultW1 * *
    ```cpp
    int16_t m_DefaultW1 = -1000;
  ```
    - **说明 * *：默认宽度 1，默认值为 - 1000。

    - **m_WidthList * *
    ```cpp
    std::vector<int> m_WidthList;
  ```
    - **说明 * *：存储字符宽度的列表。

    - **m_VertMetrics * *
    ```cpp
    std::vector<int> m_VertMetrics;
  ```
    - **说明 * *：存储垂直排版度量的列表。

    - **m_CharBBox * *
    ```cpp
    std::array<FX_RECT, 256> m_CharBBox;
  ```
    - **说明 * *：存储字符边界框的数组，大小为 256。

    ### 使用场景

    `CPDF_CIDFont` 类主要用于处理 CJK 字体，特别是那些使用 CID 编码的字体。它提供了丰富的接口来管理字符编码、字形索引、字符宽度、边界框等信息。通过这些功能，PDF 渲染器可以正确解析和显示复杂的 CJK 文本。此外，该类还支持垂直排版和字符映射，确保文本渲染的准确性和一致性。

    ### 总结

    `CPDF_CIDFont` 类是一个功能强大的工具，专门用于处理 CID 字体，特别是在处理 CJK 文本时非常重要。它不仅提供了基本的字体管理功能，还支持复杂的字符映射、字形替换和垂直排版等功能。通过 `CPDF_CIDFont`，开发者可以确保 PDF 文档中的 CJK 文本能够正确显示和渲染。
    
    
    
    // Copyright 2016 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_FPDFAPI_FONT_CPDF_CIDFONT_H_
#define CORE_FPDFAPI_FONT_CPDF_CIDFONT_H_

#include <stdint.h>

#include <array>
#include <memory>
#include <vector>

#include "core/fpdfapi/font/cpdf_font.h"
#include "core/fxcrt/fx_coordinates.h"
#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/retain_ptr.h"
#include "core/fxcrt/unowned_ptr.h"

enum CIDSet : uint8_t {
  CIDSET_UNKNOWN,
  CIDSET_GB1,
  CIDSET_CNS1,
  CIDSET_JAPAN1,
  CIDSET_KOREA1,
  CIDSET_UNICODE,
  CIDSET_NUM_SETS
};

struct CIDTransform {
  uint16_t cid;
  uint8_t a;
  uint8_t b;
  uint8_t c;
  uint8_t d;
  uint8_t e;
  uint8_t f;
};

class CFX_CTTGSUBTable;
class CPDF_CID2UnicodeMap;
class CPDF_CMap;
class CPDF_StreamAcc;

class CPDF_CIDFont final : public CPDF_Font {
 public:
  CONSTRUCT_VIA_MAKE_RETAIN;
  ~CPDF_CIDFont() override;

  static float CIDTransformToFloat(uint8_t ch);

  // CPDF_Font:
  bool IsCIDFont() const override;
  const CPDF_CIDFont* AsCIDFont() const override;
  CPDF_CIDFont* AsCIDFont() override;
  int GlyphFromCharCode(uint32_t charcode, bool* pVertGlyph) override;
  int GetCharWidthF(uint32_t charcode) override;
  FX_RECT GetCharBBox(uint32_t charcode) override;
  uint32_t GetNextChar(ByteStringView pString, size_t* pOffset) const override;
  size_t CountChar(ByteStringView pString) const override;
  void AppendChar(ByteString* str, uint32_t charcode) const override;
  bool IsVertWriting() const override;
  bool IsUnicodeCompatible() const override;
  bool Load() override;
  WideString UnicodeFromCharCode(uint32_t charcode) const override;
  uint32_t CharCodeFromUnicode(wchar_t Unicode) const override;

  uint16_t CIDFromCharCode(uint32_t charcode) const;
  const CIDTransform* GetCIDTransform(uint16_t cid) const;
  int16_t GetVertWidth(uint16_t cid) const;
  CFX_Point16 GetVertOrigin(uint16_t cid) const;
  int GetCharSize(uint32_t charcode) const;

 private:
  enum class CIDFontType : bool {
    kType1,    // CIDFontType0
    kTrueType  // CIDFontType2
  };

  CPDF_CIDFont(CPDF_Document* pDocument, RetainPtr<CPDF_Dictionary> pFontDict);

  void LoadGB2312();
  int GetGlyphIndex(uint32_t unicodeb, bool* pVertGlyph);
  int GetVerticalGlyph(int index, bool* pVertGlyph);
  void LoadSubstFont();
  wchar_t GetUnicodeFromCharCode(uint32_t charcode) const;

  RetainPtr<const CPDF_CMap> m_pCMap;
  UnownedPtr<const CPDF_CID2UnicodeMap> m_pCID2UnicodeMap;
  RetainPtr<CPDF_StreamAcc> m_pStreamAcc;
  std::unique_ptr<CFX_CTTGSUBTable> m_pTTGSUBTable;
  CIDFontType m_FontType = CIDFontType::kTrueType;
  bool m_bCIDIsGID = false;
  bool m_bAnsiWidthsFixed = false;
  bool m_bAdobeCourierStd = false;
  CIDSet m_Charset = CIDSET_UNKNOWN;
  int16_t m_DefaultWidth = 1000;
  int16_t m_DefaultVY = 880;
  int16_t m_DefaultW1 = -1000;
  std::vector<int> m_WidthList;
  std::vector<int> m_VertMetrics;
  std::array<FX_RECT, 256> m_CharBBox;
};

#endif  // CORE_FPDFAPI_FONT_CPDF_CIDFONT_H_
